#ifndef CHATSERVER_H
#define CHATSERVER_H

#include <vector>
#include <thread>
#include <queue>
#include <condition_variable>
#include <mutex>
#include <functional>
#include <myhead.h>

#define N 128   // 消息缓冲区的大小
#define LOGIN   1 // 登录状态
#define CHAT    2  // 聊天状态
#define QUIT    3  // 退出状态

class ChatServer {
public:
    struct MSG{
        int type;        // 消息类型
        char name[20];   // 用户名
        char text[N];    // 消息内容
        //序列化：将消息结构体转化成二进制数据
        string serialize() const
        {
            string data;
            data.append(reinterpret_cast<const char*>(&type), sizeof(type));   // 序列化消息类型
            data.append(name, sizeof(name));   // 序列化用户名
            data.append(text, sizeof(text));   // 序列化消息内容
            return data;
        }
        //反序列化：将二进制数据转化成消息结构体
        void deserialize(const string& data)
        {
            size_t offset = 0;
            memcpy(&type, data.c_str()+offset, sizeof(type));   // 反序列化消息类型
            offset += sizeof(type);

            memcpy(name, data.c_str()+offset, sizeof(name));   // 反序列化用户名
            offset += sizeof(name);

            memcpy(text, data.c_str()+offset, sizeof(text));   // 反序列化消息内容
        }
    };

    struct Client
    {
        int fd;
        struct sockaddr_in cin;
    };
private:
    int sfd;                   // 服务器套接字
    vector<Client> clients;    // 在线客户端列表
    mutex client_mutex;        // 客户端列表锁

    //线程池相关----------------------------------------
    vector<thread> workers;   //线程容器
    queue<function<void()>> tasks;   //任务队列
    mutex task_mutex;   //互斥锁
    condition_variable task_cv;   //用于通知线程的条件变量
    bool stop;   //线程池是否停止

    void startThreadPool(size_t numThreads);
    void errLog(const char* msg);  //错误日志
    void addTask(function<void()> task);

    

public:

    ChatServer(const char* ip,int port,size_t ThreadPoolSize = 4);
    ~ChatServer();

    void run();   //运行服务器
    void handleClient(int client_fd, struct sockaddr_in cin);   //处理客户端请求
    void broadcast(const MSG& msg, int exclude_fd = -1);   //向所有客户端广播消息


};














#endif // CHATSERVER_H